/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controlador.Service.Seguridad;

import Controlador.Bean.Log.Log;
import Controlador.Bean.Produccion.ProductoF;
import Controlador.Bean.Seguridad.Perfil;
import Data.config.SessionFac;
import gui.General.Main;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import sun.util.logging.resources.logging;

/**
 *
 * @author MI PC
 */
public class ServicioPerfil {
    public static List<Perfil>  seleccionarTodo(){
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        List<Perfil> data = (List)sqlsession.selectList("Data.Seguridad.ServicioPerfil.seleccionarTodo");
        sqlsession.close();
        return data;
    
    }
    public List<Perfil>  seleccionarXCriterios(Perfil criterios){
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        List<Perfil> data = (List)sqlsession.selectList("Data.Seguridad.ServicioPerfil.seleccionarxCriterios",criterios);
        sqlsession.close();
        return data;
    
    }
    
    public void Guardar(Perfil perfil, HashMap<String,List<String>> PorAgregar,HashMap<String,List<String>> PorEliminar, HashMap<String,String> PorAgregarA,HashMap<String,String> PorEliminarA){
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        boolean test= true;
        try{
        perfil.setIdPerfil(this.ObtenerSiguienteId(sqlsession));        
        sqlsession.insert("Data.Seguridad.ServicioPerfil.guardar",perfil);        
        this.guardarPermisos(sqlsession,perfil, PorAgregar, PorEliminar,PorAgregarA,PorEliminarA);       
        sqlsession.commit();        
        }
        catch(Exception e){
        sqlsession.rollback();
        test=false;
        }
        finally{
        sqlsession.close();        
        }
        if(test){
        java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date fecha= new Date();
        String f=sdf.format(fecha);
        Log.setInstancia(Main.usu.getIdUsuario(),"SEGMTPER","Modificar perfil",f);
        }
    }
    
    public String ObtenerSiguienteId(SqlSession sqlsession){ 
        String mask="000000";
        String id=sqlsession.selectOne("Data.Seguridad.ServicioPerfil.seleccionarMaxId");
        if(id!=null || !id.isEmpty()) {
            String nextNumber= String.valueOf(Integer.valueOf(id.substring(3, id.length()))+1);
            id=id.substring(0,3)+mask.substring(0,mask.length()-nextNumber.length())+nextNumber;
        }
        else id="PRF000001";
        return id;        

    }
    
    public static boolean verificarPermiso(String usuario,ArrayList<String> CasoUso,String accion){
        if(Main.hashMain.get(CasoUso+"."+accion)==null){
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        HashMap<String,Object> map=new HashMap<String,Object>();
        map.put("idaccion", accion);
        map.put("list", CasoUso);
        map.put("idusuario", usuario);
        List<String> data = (List)sqlsession.selectList("Data.Seguridad.ServicioPermisos.verificarAccesoM",map);        
        sqlsession.close();
        for(int i=0;i<data.size();i++){
            Main.hashMain.put(data.get(i)+"."+accion,1);            
        }
        
        return data.size()>0;
        }
        else {
            int k=0;
            for(int i=0;i<CasoUso.size();i++){
                if(Main.hashMain.get(CasoUso.get(i)+"."+accion)!=null && Main.hashMain.get(CasoUso.get(i)+"."+accion)>0)k++;            
            }
            
            return k>0;
        }
        
    }
    
    
    
    public static boolean verificarPermiso(String usuario,String CasoUso,String accion){
        if(Main.hashMain.get(CasoUso+"."+accion)==null){
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        HashMap<String,String> map=new HashMap<String,String>();
        map.put("idaccion", accion);
        map.put("idcasouso", CasoUso);
        map.put("idusuario", usuario);
        List<Object> data = (List)sqlsession.selectList("Data.Seguridad.ServicioPermisos.verificarAcceso",map);        
        sqlsession.close();
        Main.hashMain.put(CasoUso+"."+accion,data.size());
        return data.size()>0;
        }
        else return Main.hashMain.get(CasoUso+"."+accion)>0;
        
    }
    
    public void Actualizar(Perfil perfil, HashMap<String,List<String>> PorAgregar,HashMap<String,List<String>> PorEliminar, HashMap<String,String> PorAgregarA,HashMap<String,String> PorEliminarA){
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        boolean test=true;
        try{
        sqlsession.update("Data.Seguridad.ServicioPerfil.actualizar",perfil);        
        this.guardarPermisos(sqlsession,perfil, PorAgregar, PorEliminar,PorAgregarA,PorEliminarA);        
        sqlsession.commit();
        
        }
        catch(Exception e){
            sqlsession.rollback();
            test=false;
        }
        finally{
        sqlsession.close(); 
        }
        if(test){
        java.text.SimpleDateFormat sdf=new java.text.SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date fecha= new Date();
        String f=sdf.format(fecha);
        Log.setInstancia(Main.usu.getIdUsuario(),"SEGMTPER","Modificar perfil",f);
        }
    
    }
    
    public List<HashMap<String,Object>> obtenerPermisos(String codigo){
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        List<HashMap<String,Object>> data=null;
        if(codigo!=null)
        data = (List)sqlsession.selectList("Data.Seguridad.ServicioPerfil.seleccionarPermisosxPerfil",codigo);
        else
            data = (List)sqlsession.selectList("Data.Seguridad.ServicioPerfil.seleccionarPermisos");
        sqlsession.close();
        return data;
    }
    
    public void guardarPermisos(SqlSession sqlsession,Perfil perfil, HashMap<String,List<String>> PorAgregar,HashMap<String,List<String>> PorEliminar,HashMap<String,String> PorAgregarA,HashMap<String,String> PorEliminarA){
        HashMap<String, Object> aux= new HashMap<>();
        aux.put("perfil", perfil.getIdPerfil());
        aux.put("Agregar", new ArrayList<List<String>>( PorAgregar.values()));
        aux.put("Desactivar", new ArrayList<String>( PorEliminarA.values()));
        aux.put("Activar", new ArrayList<String>( PorAgregarA.values()));
        if(PorAgregar.size()>0)
            for(int i=0;i<PorAgregar.size();i++){
                HashMap<String,Object> temp= new HashMap<>();
                temp.put("perfil", perfil.getIdPerfil());
                temp.put("accion",((ArrayList<List<String>>) aux.get("Agregar")).get(i).get(1));
                temp.put("casouso",((ArrayList<List<String>>) aux.get("Agregar")).get(i).get(0));
                sqlsession.insert("Data.Seguridad.ServicioPerfil.insertarPermisosxPerfil", temp);
                
            }
        if(PorAgregarA.size()>0)sqlsession.update("Data.Seguridad.ServicioPerfil.activarPermisosxPerfil", aux);
        if(PorEliminarA.size()>0)sqlsession.update("Data.Seguridad.ServicioPerfil.desactivarPermisosxPerfil", aux);
        
              
        
    
    }

    public void eliminar(String idperfil) {
        SqlSession sqlsession = SessionFac.SessionFactory().openSession();
        sqlsession.update("Data.Seguridad.ServicioPerfil.eliminar",idperfil);
        sqlsession.commit();
        sqlsession.close();
        
    }
}
